Le monde ne suffit pas …
Une chaîne de traitement
Ce cours propose de décomposer les étapes successives d’une démarche de
datamining en partant d’un exemple simple : la création d’une base de
donnée sur les pays du Monde.
Claude Grasland (Professeur à
l’Université de Paris)
Introduction
1 COLLECTE
1.1 L’API de la Banque Mondiale
Supposons que l’on souhaite télécharger la population, la superficie
et le PIB des pays du monde. Plutôt que d’aller chercher des fichiers
sur un site web, nous allons utiliser une API proposée par la Banque
Mondial qui permet de télécharger les données facilement et surtout de
les mettre à jour régulièrement. Pour cela on va installer le package R
correspondant à l’API wbstats de la Banque mondiale.
https://cran.r-project.org/web/packages/wbstats/vignettes/Using_the_wbstats_package.html
Au moment du chargement du package, il est créé un fichier wb_cachelist qui fournit l’ensemble des donnes disponibles sous la forme d’une liste de tableaux de méta-données.
List of 8
$ countries : tibble [304 × 18] (S3: tbl_df/tbl/data.frame)
$ indicators : tibble [16,649 × 8] (S3: tbl_df/tbl/data.frame)
$ sources : tibble [63 × 9] (S3: tbl_df/tbl/data.frame)
$ topics : tibble [21 × 3] (S3: tbl_df/tbl/data.frame)
$ regions : tibble [48 × 4] (S3: tbl_df/tbl/data.frame)
$ income_levels: tibble [7 × 3] (S3: tbl_df/tbl/data.frame)
$ lending_types: tibble [4 × 3] (S3: tbl_df/tbl/data.frame)
$ languages : tibble [23 × 3] (S3: tbl_df/tbl/data.frame)
1.1.1 Le tableau “countries”
Il fournit des renseignements de base sur les différents pays, leurs codes, etc.
tibble [304 × 18] (S3: tbl_df/tbl/data.frame)
$ iso3c : chr [1:304] "ABW" "AFG" "AFR" "AGO" ...
$ iso2c : chr [1:304] "AW" "AF" "A9" "AO" ...
$ country : chr [1:304] "Aruba" "Afghanistan" "Africa" "Angola" ...
$ capital_city : chr [1:304] "Oranjestad" "Kabul" NA "Luanda" ...
$ longitude : num [1:304] -70 69.2 NA 13.2 19.8 ...
$ latitude : num [1:304] 12.52 34.52 NA -8.81 41.33 ...
$ region_iso3c : chr [1:304] "LCN" "SAS" NA "SSF" ...
$ region_iso2c : chr [1:304] "ZJ" "8S" NA "ZG" ...
$ region : chr [1:304] "Latin America & Caribbean" "South Asia" "Aggregates" "Sub-Saharan Africa" ...
$ admin_region_iso3c: chr [1:304] NA "SAS" NA "SSA" ...
$ admin_region_iso2c: chr [1:304] NA "8S" NA "ZF" ...
$ admin_region : chr [1:304] NA "South Asia" NA "Sub-Saharan Africa (excluding high income)" ...
$ income_level_iso3c: chr [1:304] "HIC" "LIC" NA "LMC" ...
$ income_level_iso2c: chr [1:304] "XD" "XM" NA "XN" ...
$ income_level : chr [1:304] "High income" "Low income" "Aggregates" "Lower middle income" ...
$ lending_type_iso3c: chr [1:304] "LNX" "IDX" NA "IBD" ...
$ lending_type_iso2c: chr [1:304] "XX" "XI" NA "XF" ...
$ lending_type : chr [1:304] "Not classified" "IDA" "Aggregates" "IBRD" ...
Le tableau comporte 304 observation et il mélange des pays (France), des fragments de pays (Réunion) et des agrégats de pays (Europe). Il faudra donc bien faire attention lors de l’extraction à réfléchir à ce que l’on souhaite utiliser. Par exemple, si l’on veut juste les pays :
pays<-cat$countries[cat$countries$income_level!="Aggregates",c("iso3c", "country","capital_city","longitude","latitude", "region","income_level")]
kable(head(pays))| iso3c | country | capital_city | longitude | latitude | region | income_level |
|---|---|---|---|---|---|---|
| ABW | Aruba | Oranjestad | -70.0167 | 12.51670 | Latin America & Caribbean | High income |
| AFG | Afghanistan | Kabul | 69.1761 | 34.52280 | South Asia | Low income |
| AGO | Angola | Luanda | 13.2420 | -8.81155 | Sub-Saharan Africa | Lower middle income |
| ALB | Albania | Tirane | 19.8172 | 41.33170 | Europe & Central Asia | Upper middle income |
| AND | Andorra | Andorra la Vella | 1.5218 | 42.50750 | Europe & Central Asia | High income |
| ARE | United Arab Emirates | Abu Dhabi | 54.3705 | 24.47640 | Middle East & North Africa | High income |
1.1.2 Le tableau indicators
Il comporta pas loin de 17000 variables … Autant dire qu’il est difficile de l’explorer facilement si l’on ne sait pas ce que l’on cherche.
| indicator_id | indicator | unit | indicator_desc | source_org | topics | source_id | source |
|---|---|---|---|---|---|---|---|
| 1.0.HCount.1.90usd | Poverty Headcount ($1.90 a day) | NA | The poverty headcount index measures the proportion of the population with daily per capita income (in 2011 PPP) below the poverty line. | LAC Equity Lab tabulations of SEDLAC (CEDLAS and the World Bank). | 11 , Poverty | 37 | LAC Equity Lab |
| 1.0.HCount.2.5usd | Poverty Headcount ($2.50 a day) | NA | The poverty headcount index measures the proportion of the population with daily per capita income (in 2005 PPP) below the poverty line. | LAC Equity Lab tabulations of SEDLAC (CEDLAS and the World Bank). | 11 , Poverty | 37 | LAC Equity Lab |
| 1.0.HCount.Mid10to50 | Middle Class ($10-50 a day) Headcount | NA | The poverty headcount index measures the proportion of the population with daily per capita income (in 2005 PPP) below the poverty line. | LAC Equity Lab tabulations of SEDLAC (CEDLAS and the World Bank). | 11 , Poverty | 37 | LAC Equity Lab |
1.1.3 La recherche d’indicateurs
Supposons qu’on recherche les données récentes sur le PIB. On va utiliser le mot-clé GDP pour rechercher les variables correspondantes dans le catalogue, ce qui donne 540 réponses
| indicatorID | indicator | |
|---|---|---|
| 676 | 5.51.01.10.gdp | Per capita GDP growth |
| 678 | 6.0.GDP_current | GDP (current $) |
| 679 | 6.0.GDP_growth | GDP growth (annual %) |
| 680 | 6.0.GDP_usd | GDP (constant 2005 $) |
| 681 | 6.0.GDPpc_constant | GDP per capita, PPP (constant 2011 international $) |
| 1521 | BG.GSR.NFSV.GD.ZS | Trade in services (% of GDP) |
On va finalement retenir deux indicateurs généraux
- NY.GDP.MKTP.KD : GDP (constant 2010 US$)
- NY.GDP.MKTP.PP.CD : GDP, PPP (current international $)
Puis examiner plus en détail leurs métadonnées
meta<-cat$indicators[cat$indicators$indicator_id %in% c("NY.GDP.MKTP.KD","NY.GDP.MKTP.PP.CD"),]
kable(meta)| indicator_id | indicator | unit | indicator_desc | source_org | topics | source_id | source |
|---|---|---|---|---|---|---|---|
| NY.GDP.MKTP.KD | GDP (constant 2010 US$) | NA | GDP at purchaser’s prices is the sum of gross value added by all resident producers in the economy plus any product taxes and minus any subsidies not included in the value of the products. It is calculated without making deductions for depreciation of fabricated assets or for depletion and degradation of natural resources. Data are in constant 2010 U.S. dollars. Dollar figures for GDP are converted from domestic currencies using 2010 official exchange rates. For a few countries where the official exchange rate does not reflect the rate effectively applied to actual foreign exchange transactions, an alternative conversion factor is used. | World Bank national accounts data, and OECD National Accounts data files. | 3 , Economy & Growth | 2 | World Development Indicators |
| NY.GDP.MKTP.PP.CD | GDP, PPP (current international $) | NA | This indicator provides values for gross domestic product (GDP) expressed in current international dollars, converted by purchasing power parity (PPP) conversion factor. GDP is the sum of gross value added by all resident producers in the country plus any product taxes and minus any subsidies not included in the value of the products. PPP conversion factor is a spatial price deflator and currency converter that eliminates the effects of the differences in price levels between countries. From April 2020, “GDP: linked series (current LCU)” [NY.GDP.MKTP.CN.AD] is used as underlying GDP in local currency unit so that it’s in line with time series of PPP conversion factors for GDP, which are extrapolated with linked GDP deflators. | International Comparison Program, World Bank | World Development Indicators database, World Bank | Eurostat-OECD PPP Programme. | 3 , Economy & Growth | 2 | World Development Indicators |
1.1.4 L’extraction des données
Elle se fait à l’aide de la fonction wb_data qui comporte de
nombreuses options. On peut par exemple extraire la valeur la plus
récentes à l’aide de l’option mrv = 1
On peut ainsi établir le palmares des pays ayant le plus fort PIB en dollars au taux de change
tabGDP <- wb_data(indicator = c("NY.GDP.MKTP.KD"),
return_wide = TRUE,
mrv=1,
country ="countries_only")
tabGDP<-tabGDP[order(tabGDP$NY.GDP.MKTP.KD,decreasing = T),]
kable(head(tabGDP,10))| iso2c | iso3c | country | date | NY.GDP.MKTP.KD | unit | obs_status | footnote | last_updated |
|---|---|---|---|---|---|---|---|---|
| US | USA | United States | 2023 | 22062578283267 | NA | NA | NA | 2024-12-16 |
| CN | CHN | China | 2023 | 17175670911004 | NA | NA | NA | 2024-12-16 |
| JP | JPN | Japan | 2023 | 4605911988192 | NA | NA | NA | 2024-12-16 |
| DE | DEU | Germany | 2023 | 3692366831511 | NA | NA | NA | 2024-12-16 |
| GB | GBR | United Kingdom | 2023 | 3234504373105 | NA | NA | NA | 2024-12-16 |
| IN | IND | India | 2023 | 3215973434046 | NA | NA | NA | 2024-12-16 |
| FR | FRA | France | 2023 | 2671234714330 | NA | NA | NA | 2024-12-16 |
| IT | ITA | Italy | 2023 | 2010974774790 | NA | NA | NA | 2024-12-16 |
| BR | BRA | Brazil | 2023 | 1954752120906 | NA | NA | NA | 2024-12-16 |
| CA | CAN | Canada | 2023 | 1783097209319 | NA | NA | NA | 2024-12-16 |
… ou bien en oarité de pouvoir d’achat :
tabGDP <- wb_data(indicator = c("NY.GDP.MKTP.PP.CD"),
return_wide = TRUE,
mrv=1,
country ="countries_only")
tabGDP<-tabGDP[order(tabGDP$NY.GDP.MKTP.PP.CD,decreasing = T),]
kable(head(tabGDP,10))| iso2c | iso3c | country | date | NY.GDP.MKTP.PP.CD | unit | obs_status | footnote | last_updated |
|---|---|---|---|---|---|---|---|---|
| CN | CHN | China | 2023 | 34660138175164 | NA | NA | NA | 2024-12-16 |
| US | USA | United States | 2023 | 27720709000000 | NA | NA | NA | 2024-12-16 |
| IN | IND | India | 2023 | 14619765554295 | NA | NA | NA | 2024-12-16 |
| RU | RUS | Russian Federation | 2023 | 6454737767947 | NA | NA | NA | 2024-12-16 |
| JP | JPN | Japan | 2023 | 6239019356204 | NA | NA | NA | 2024-12-16 |
| DE | DEU | Germany | 2023 | 5949380762927 | NA | NA | NA | 2024-12-16 |
| BR | BRA | Brazil | 2023 | 4456606930516 | NA | NA | NA | 2024-12-16 |
| ID | IDN | Indonesia | 2023 | 4334715225911 | NA | NA | NA | 2024-12-16 |
| FR | FRA | France | 2023 | 4197857385076 | NA | NA | NA | 2024-12-16 |
| GB | GBR | United Kingdom | 2023 | 4075450467323 | NA | NA | NA | 2024-12-16 |
1.2 Puissance pays du Monde (1990-2025)
Nous allons essayer de constituer un tableau de la puissance des pays du Monde au cours de la période 1990-20205, à l’aide de six indicateurs de stock correspondant à différentes formes de puissance :
- Puissance territoriale
- SRF : Superficie totale du pays en km2
- ARB : Superficie de terres arables en hectares
- Puissance démographique
- POP : Population totale en habitants
- URB : Population urbaine en habitants
- Puissance économique
- GDP : Produit Intérieur Brut au taux de change
- GPP : Produit Intérieur Brut en parité de pouvoir d’achat
Ces indicateurs ont été choisis en raison de leur simplicité qui en assure la disponibilité pour la plupart des pays et pour la plupart des dates (excepté dans le cas du CO2 qui n’est mesuré que tardivement.)
1.2.1 Choix des indicateurs
On choisit un ensemble de données dont on connait l’identifiant et que l’on souhaite pouvoir analyser sur une période de temps longue.
world_data <- wb_data(indicator = c("AG.SRF.TOTL.K2","AG.LND.ARBL.HA","SP.POP.TOTL","SP.URB.TOTL","NY.GDP.MKTP.CD", "NY.GDP.MKTP.PP.CD"),
return_wide = TRUE,
start_date = 1960,
end_date = 2024,
country ="countries_only")
world_data<-world_data[,-c(1,3)]
# recodage (attention : ordre alphabetique)
names(world_data)<-c("iso3c","date","ARB","SRF","GDP","GPP","POP","URB")1.2.2 Corriger un bug
Pour une raison inconnue, la banque mondiale affiche une valeur incorrecte pour la superficie du Canada !
1.2.3 Recoller avec les données pays
On rajoute quelques données relatives au pays qui pourront être utiles par la suite.
pays<-cat$countries[cat$countries$income_level!="Aggregates",c("iso3c", "country","capital_city","longitude","latitude", "region","income_level")]
tab<-merge(pays,world_data, by="iso3c",all.x=F,all.y=T)
kable(head(tab))| iso3c | country | capital_city | longitude | latitude | region | income_level | date | ARB | SRF | GDP | GPP | POP | URB |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ABW | Aruba | Oranjestad | -70.0167 | 12.5167 | Latin America & Caribbean | High income | 1960 | NA | NA | NA | NA | 54922 | 27887 |
| ABW | Aruba | Oranjestad | -70.0167 | 12.5167 | Latin America & Caribbean | High income | 1961 | 2000 | 180 | NA | NA | 55578 | 28212 |
| ABW | Aruba | Oranjestad | -70.0167 | 12.5167 | Latin America & Caribbean | High income | 1962 | 2000 | 180 | NA | NA | 56320 | 28580 |
| ABW | Aruba | Oranjestad | -70.0167 | 12.5167 | Latin America & Caribbean | High income | 1963 | 2000 | 180 | NA | NA | 57002 | 28917 |
| ABW | Aruba | Oranjestad | -70.0167 | 12.5167 | Latin America & Caribbean | High income | 1964 | 2000 | 180 | NA | NA | 57619 | 29221 |
| ABW | Aruba | Oranjestad | -70.0167 | 12.5167 | Latin America & Caribbean | High income | 1965 | 2000 | 180 | NA | NA | 58190 | 29502 |
1.2.4 Ajouter des métadonnées
# Extract meta
meta<-cat$indicators[cat$indicators$indicator_id %in% c("AG.SRF.TOTL.K2","AG.LND.ARBL.HA","SP.POP.TOTL","SP.URB.TOTL","NY.GDP.MKTP.CD", "NY.GDP.MKTP.PP.CD"),]
# Select information and add personal code
meta<-data.frame(meta[,c(1,2,4,5)])
meta$shortcode<-c("ARB","SRF","GDP","GPP","POP","URB")
meta<-meta[,c(5,1,2,3,4)]
# Display
kable(meta)| shortcode | indicator_id | indicator | indicator_desc | source_org |
|---|---|---|---|---|
| ARB | AG.LND.ARBL.HA | Arable land (hectares) | Arable land (in hectares) includes land defined by the FAO as land under temporary crops (double-cropped areas are counted once), temporary meadows for mowing or for pasture, land under market or kitchen gardens, and land temporarily fallow. Land abandoned as a result of shifting cultivation is excluded. | Food and Agriculture Organization, electronic files and web site. |
| SRF | AG.SRF.TOTL.K2 | Surface area (sq. km) | Surface area is a country’s total area, including areas under inland bodies of water and some coastal waterways. | Food and Agriculture Organization, electronic files and web site. |
| GDP | NY.GDP.MKTP.CD | GDP (current US$) | GDP at purchaser’s prices is the sum of gross value added by all resident producers in the economy plus any product taxes and minus any subsidies not included in the value of the products. It is calculated without making deductions for depreciation of fabricated assets or for depletion and degradation of natural resources. Data are in current U.S. dollars. Dollar figures for GDP are converted from domestic currencies using single year official exchange rates. For a few countries where the official exchange rate does not reflect the rate effectively applied to actual foreign exchange transactions, an alternative conversion factor is used. | World Bank national accounts data, and OECD National Accounts data files. |
| GPP | NY.GDP.MKTP.PP.CD | GDP, PPP (current international $) | This indicator provides values for gross domestic product (GDP) expressed in current international dollars, converted by purchasing power parity (PPP) conversion factor. GDP is the sum of gross value added by all resident producers in the country plus any product taxes and minus any subsidies not included in the value of the products. PPP conversion factor is a spatial price deflator and currency converter that eliminates the effects of the differences in price levels between countries. From April 2020, “GDP: linked series (current LCU)” [NY.GDP.MKTP.CN.AD] is used as underlying GDP in local currency unit so that it’s in line with time series of PPP conversion factors for GDP, which are extrapolated with linked GDP deflators. | International Comparison Program, World Bank | World Development Indicators database, World Bank | Eurostat-OECD PPP Programme. |
| POP | SP.POP.TOTL | Population, total | Total population is based on the de facto definition of population, which counts all residents regardless of legal status or citizenship. The values shown are midyear estimates. | (1) United Nations Population Division. World Population Prospects: 2019 Revision. (2) Census reports and other statistical publications from national statistical offices, (3) Eurostat: Demographic Statistics, (4) United Nations Statistical Division. Population and Vital Statistics Reprot (various years), (5) U.S. Census Bureau: International Database, and (6) Secretariat of the Pacific Community: Statistics and Demography Programme. |
| URB | SP.URB.TOTL | Urban population | Urban population refers to people living in urban areas as defined by national statistical offices. It is calculated using World Bank population estimates and urban ratios from the United Nations World Urbanization Prospects. Aggregation of urban and rural population may not add up to total population because of different country coverages. | World Bank staff estimates based on the United Nations Population Division’s World Urbanization Prospects: 2018 Revision. |
2 ESTIMATIONS
Le tableau que nous avons construit comporte encore de nombreuses valeurs manquantes. Or, notre objectif est de calculer la part d’un pays dans le total mondial ce qui n’est pas possibl si on ne dipose pas d’une estimation des valeurs de chacun des pays.
Nous allons donc construire un nouveau tableau où l’on essayera de remplir le maximum de valeurs manquantes tout en précisant la méthode d’estimatiopn utilisée.
2.1 Diagnostic des valeurs manquantes
Avant toute chose, nous allons estimer pour chacune des variables la part des valeurs manquantes en fonction des dates ou des pays.
2.1.1 Corrections manuelles
- On complète les données de terres arables et de superficie qui manquent pour les dernières dates car elles ont du peu évoluer.
- On complète également les données de CO2 en conservant la valeur de 2015 ce qui est évidememnt abusif mais permet d’avoir un tableau complet.
- On ajoute manuellement la superficie du Soudan et du Sud-Soudan
- On procède à une estimation grossière du PIB de la Corée du Nord à partir de ses émissions de CO2 en supposant qu’elles suivent la même loi qu’en Corée du Sud
- On procède de la même manière à l’estimation de la population urbaine du Kosovo par celle de la Serbie
# Load data
don<-readRDS("data/wb_don_1960_2023.Rdata")
# Correction terres arables
length(don$ARB[don$date==2016])[1] 217
2.1.2 Tableau de synthèse
On crée un tableau de synthèse des valeurs manquantes en mode colonne
(toutes les variables les unes au dessus des autres et non pas côte à
côte) et on utilise pour cela le package tidyverse qui est
adapté à ce type de manipulation, notamment avec la fonction
gather.
tabmis<-don %>% select(iso3c,country,date,ARB,SRF,GDP,GPP,POP, URB) %>%
gather("ARB", "SRF","GDP","GPP","POP","URB",key = VAR, value = DON) %>%
mutate(Missing = is.na(DON))
kable(head(tabmis)) | iso3c | country | date | VAR | DON | Missing |
|---|---|---|---|---|---|
| ABW | Aruba | 1960 | ARB | 2000 | FALSE |
| ABW | Aruba | 1961 | ARB | 2000 | FALSE |
| ABW | Aruba | 1962 | ARB | 2000 | FALSE |
| ABW | Aruba | 1963 | ARB | 2000 | FALSE |
| ABW | Aruba | 1964 | ARB | 2000 | FALSE |
| ABW | Aruba | 1965 | ARB | 2000 | FALSE |
2.1.3 Valeurs manquantes par date
On réalise un graphique montrant le % de données manquantes par date
et par variable en se servant de ggplot2
res <- tabmis %>% group_by(VAR, date) %>%
summarise(nbmis=sum(Missing), nb=n(), pct = 100*nbmis/nb)
p<-ggplot(res) +
aes(x=date,y=pct,color=VAR) +
geom_line() +
scale_y_continuous("% de pays à valeurs manquantes", breaks = c(0,10,20,30,40,50,60,70,80,90,100))+
scale_x_continuous("Année", breaks = c(1960, 1965, 1970, 1975, 1980, 1985,1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025))
pLes valeurs manquantes des années 1990 sont liées souvent à des pays qui n’existent pas encore comme le Sud-Soudan ou le Kosovo et qui ne disposent donc pas de données. Le fait qu’il demeure toujours 5% de pays non renseignés est lié à des pays de très petite taille mal documentés.
On observe que les données relatives au CO2 et aux terres arables (ARB) n’existent pour aucun pays après 2016. Il en va de même pour la superficie totale (SRF) des pays en 2019. Comme cette variable évolue peu au cours du temps, on affecte la valeur de la dernière année disponible.
2.1.4 Valeurs manquantes par pays
On examine maintenant les pays ayant la plus forte proportion de valeurs manquantesn indépendamment de la variable concernée.
res <- tabmis %>% group_by(iso3c, country) %>%
summarise(nbmis=sum(Missing), nb=n(), pct = 100*nbmis/nb) %>%
arrange(-pct)
kable(head(res,20))| iso3c | country | nbmis | nb | pct |
|---|---|---|---|---|
| MAF | St. Martin (French part) | 303 | 384 | 78.90625 |
| XKX | Kosovo | 288 | 384 | 75.00000 |
| SSD | South Sudan | 216 | 384 | 56.25000 |
| GIB | Gibraltar | 193 | 384 | 50.26042 |
| SXM | Sint Maarten (Dutch part) | 162 | 384 | 42.18750 |
| ERI | Eritrea | 154 | 384 | 40.10417 |
| CUW | Curacao | 144 | 384 | 37.50000 |
| MCO | Monaco | 138 | 384 | 35.93750 |
| MNP | Northern Mariana Islands | 138 | 384 | 35.93750 |
| PSE | West Bank and Gaza | 129 | 384 | 33.59375 |
| PRK | Korea, Dem. People’s Rep. | 128 | 384 | 33.33333 |
| VGB | British Virgin Islands | 128 | 384 | 33.33333 |
| MNE | Montenegro | 120 | 384 | 31.25000 |
| MAC | Macao SAR, China | 117 | 384 | 30.46875 |
| SRB | Serbia | 116 | 384 | 30.20833 |
| LUX | Luxembourg | 110 | 384 | 28.64583 |
| GRL | Greenland | 108 | 384 | 28.12500 |
| ASM | American Samoa | 107 | 384 | 27.86458 |
| GUM | Guam | 107 | 384 | 27.86458 |
| CHI | Channel Islands | 104 | 384 | 27.08333 |
Trois cas apparaissent clairement :
Micro-états et territoires dépendants comme Monaco, Nauru, Guam, etc…
Etats issus de recompositions frontalières comme le Nord et le Sud-Soudan, le Kosovo, la Serbie, l’Erythrée … Ce sont par définition des pays qui n’existent pas à toutes les dates et l’attribution de valeurs dans le passé est une reconstitution.
Etats en crise ou dictatures qui ne fournissent pas de données comme la Corée du Nord ou sont dans l’incapacité de le faire comme la Syrie au cours des dernières années.
Si le premier cas n’est pas trop gênant (les petits états pèsent peu dans le total mondial), les second et troisième cas sont plus ennuyeux car il speuvent fausser le calcul de la part du total mondial des autres pays. On va donc tenter de proposer une estimation des valeurs manquantes qui permette de reconstituer le total mondial.
2.2 Estimation des valeurs manquantes
2.2.1 Fonction d’estimation
Nous avons construit ici une fonction d’estimation complexe qui utilise trois méthodes différentes selon la disposition des données manquantes :
- interpolation : dans le cas d’une série interrompue sur un intervalle
- extrapolation : dans le cas d’ue série où il manque les dernières valeurs et pour laquelle on applique la tendance moyenne des pays à valeurs non manquantes.
- retropolation : dans le cas d’une série où il manque les premières valeurs et pour laquelle on applique la tendance moyenne des pays à valeurs non manquantes.
La méthode n’est toutefois pas applicable dans deux cas :
- absence complète de données pour un pays : car on ne dispose d’aucun point de calage
- absence complète de données pour une année : car on ne dispose pas de tendance moyenne de référence.
# load a data.frame with columns space, time, indic
estim<-function(df = don) # dataframe
{
# Select variable
sel<-dcast(df,space~time)
M<-as.matrix(sel[,-1])
rownames(M)<-sel$space
####################################################
######## Estimation Procedure ####################
####################################################
# check for lines or column filled with missing values and eliminate
check1<-apply(!is.na(M),FUN="sum",1)
check2<-apply(!is.na(M),FUN="sum",2)
M<-M[check1>0,check2>0]
dim(M)
# define dimensions
nr<-nrow(M)
nr
nc<-ncol(M)
nc
# create time matrix with NA
Mt<-matrix(rep(1:nc,nr),nrow=nr,nc=nc,byrow=T)
rownames(Mt)<-rownames(M)
colnames(Mt)<-colnames(M)
Mt[is.na(M)]<-NA
Mt[1:4,1:4]
# identify previous and next available valuer
Mt_min<-Mt
Mt_max<-Mt
for ( i in 1:nr) {
for ( j in 1:nc) {
if (is.na(Mt[i,j])) {
Mt_min[i,j]<-max(Mt[i,1:j],na.rm=T)
Mt_max[i,j]<-min(Mt[i,j:nc],na.rm=T)
}
}
}
Mt_min[1:4,1:4]
Mt_max[1:4,1:4]
# choose estimation method
M_met<-matrix("OK",nrow=nr,ncol=nc)
rownames(M_met)<-rownames(M)
colnames(M_met)<-colnames(M)
for ( i in 1:nr) {
for ( j in 1:nc) {
if (is.na(Mt[i,j])) {
M_met[i,j]<-"IN"
if (is.infinite(Mt_max[i,j])) {M_met[i,j]<-"EX"}
if (is.infinite(Mt_min[i,j])) {M_met[i,j]<-"RE"}
}
}
}
M_met[1:4,1:4]
###### Estimation of missing values ####
M_est<-M
str(M_est)
#### step 1: Interpolation ######
for ( i in 1:nr) {
for ( j in 1:nc) {
if ((M_met[i,j]=="IN")) {
t0<-Mt_min[i,j]
t1<-Mt_max[i,j]
tacm<-(M[i,t1]/M[i,t0])**(1/(t1-t0))
M_est[i,j]<-M[i,t0]*(tacm**(j-t0))
}
}
}
M_est[1:4,1:4]
#### step 2: Extrapolation ######
for ( i in 1:nr) {
for ( j in 2:nc) {
if ((M_met[i,j]=="EX")) {
N<-M_est
t0<-j-1
t1<-j
N<-M_est[is.na(M_est[,t0])==F,]
N<-N[is.na(N[,t1])==F,]
tacm<-(sum(N[,t1])/sum(N[,t0]))**(1/(t1-t0))
M_est[i,j]<-M_est[i,t0]*(tacm**(t1-t0))
}
}
}
M_est[1:4,1:4]
#### step 3: Retropolation ######
for ( i in 1:nr) {
for ( j in (nc-1):1) {
if ((M_met[i,j]=="RE")) {
N<-M_est
t0<-j
t1<-j+1
N<-M_est[is.na(M_est[,t0])==F,]
N<-N[is.na(N[,t1])==F,]
tacm<-(sum(N[,t1])/sum(N[,t0]))**(1/(t1-t0))
M_est[i,j]<-M_est[i,t1]/(tacm**(t1-t0))
}
}
}
M_est[1:4,1:4]
#######################################################
############# EXPORT RESULTS #########################
#######################################################
x<-reshape2::melt(M_est)
names(x)<-c("space","time","estim")
y<-reshape2::melt(M_met)
names(y)<-c("space","time","method")
z<-merge(x,y, by=c("space","time"))
return(z)
}2.2.2 Application de la fonction
On va reconstituer pour chacune de nos variables les valeurs estimées lorsque cela est possible
num [1:207, 1:64] 2000 7650000 2670000 432000 1000 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:207] "ABW" "AFG" "AGO" "ALB" ...
..$ : chr [1:64] "1960" "1961" "1962" "1963" ...
names(est)<-c("iso3c","date","ARB_est")
don<-merge(don,est, by=c("iso3c","date"), all.x=T,al.y=F)
# Estim SRF
df<-data.table(space=don$iso3c,time=don$date,index=don$SRF)
est<-estim(df)[,1:3] num [1:216, 1:64] 180 652860 1246700 28750 470 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:216] "ABW" "AFG" "AGO" "ALB" ...
..$ : chr [1:64] "1960" "1961" "1962" "1963" ...
names(est)<-c("iso3c","date","SRF_est")
don<-merge(don,est, by=c("iso3c","date"), all.x=T,al.y=F)
# Estim GDP
df<-data.table(space=don$iso3c,time=don$date,index=don$GDP)
est<-estim(df)[,1:3] num [1:214, 1:64] NA NA NA NA NA NA NA NA NA NA ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:214] "ABW" "AFG" "AGO" "ALB" ...
..$ : chr [1:64] "1960" "1961" "1962" "1963" ...
names(est)<-c("iso3c","date","GDP_est")
don<-merge(don,est, by=c("iso3c","date"), all.x=T,al.y=F)
## Estim GPP
df<-data.table(space=don$iso3c,time=don$date,index=don$GPP)
est<-estim(df)[,1:3] num [1:203, 1:34] 1363802058 NA 38839000563 8378238406 1310131885 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:203] "ABW" "AFG" "AGO" "ALB" ...
..$ : chr [1:34] "1990" "1991" "1992" "1993" ...
names(est)<-c("iso3c","date","GPP_est")
don<-merge(don,est, by=c("iso3c","date"), all.x=T,al.y=F)
# Estim POP
df<-data.table(space=don$iso3c,time=don$date,index=don$POP)
est<-estim(df)[,1:3] num [1:217, 1:64] 54922 9035043 5231654 1608800 9510 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:217] "ABW" "AFG" "AGO" "ALB" ...
..$ : chr [1:64] "1960" "1961" "1962" "1963" ...
names(est)<-c("iso3c","date","POP_est")
don<-merge(don,est, by=c("iso3c","date"), all.x=T,al.y=F)
# Estim URB
df<-data.table(space=don$iso3c,time=don$date,index=don$URB)
est<-estim(df)[,1:3] num [1:215, 1:64] 27887 759034 545923 493982 5559 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:215] "ABW" "AFG" "AGO" "ALB" ...
..$ : chr [1:64] "1960" "1961" "1962" "1963" ...
Dans le cas du PIB en parité de pouvoir d’achat avant 1990, ondoit procéder à une estimaation séparée car aucune valeur n’est disponible pour aucun pays du Monde.
obs<-don %>% filter(is.na(GPP_est)==F) %>%select(iso3c, date, POP_est, GDP_est, GPP_est)
obs$y<-obs$GPP_est/obs$POP_est
obs$x<-obs$GDP_est/obs$POP_est
plot(obs$x,obs$y,log = 'xy')
Call:
lm(formula = log(obs$y) ~ log(obs$x))
Coefficients:
(Intercept) log(obs$x)
2.745 0.758
Call:
lm(formula = log(obs$GPP_est) ~ log(obs$GDP_est) + log(obs$POP_est))
Residuals:
Min 1Q Median 3Q Max
-1.94972 -0.21889 -0.00968 0.20391 2.85161
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.087406 0.040794 51.17 <0.0000000000000002 ***
log(obs$GDP_est) 0.770493 0.002695 285.91 <0.0000000000000002 ***
log(obs$POP_est) 0.265849 0.002897 91.76 <0.0000000000000002 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.3514 on 6899 degrees of freedom
Multiple R-squared: 0.9791, Adjusted R-squared: 0.9791
F-statistic: 1.62e+05 on 2 and 6899 DF, p-value: < 0.00000000000000022
# Estimation
don$GPP_est[is.na(don$GPP_est)]<-don$POP_est[is.na(don$GPP_est)]*((don$GDP_est[is.na(don$GPP_est)]/don$POP_est[is.na(don$GPP_est)])**0.758)*exp(2.745)
# Save
saveRDS(don,"data/wb_don_1960_2023.Rdata")Attention ! les valeurs estimées sont parfois très éloignées de la réalité, surtout dans le cas des extrapolations où elles suivent la tendance mondiale. Mais cette méthode d’estimation permet, comme nous l’avons expliqué, de pouvir calculer le total mondial et, du coup, de pouvoir estimer pour chaque critère la part du pays dans la population mondiale et son rang à chacune des dates.
3 TRANSFORMATION
On se propose d’enrichir notre tableau à l’aide de nouvelles variables
- Rang des pays pour chacun des critères
- Part des pays dans le total mondial pour chacun des critères
- Indicateurs synthétiques de puissance combinant les différents critères
3.1 Rangs mondial des pays
3.1.1 Calcul des rangs par variable et date
On utilise dplyr pour calculer le rand de chaque variable à chacune des dates. On ajoute une variable supplémenaire qui est la moyenne des rang sur les six classements.
don<-readRDS("data/wb_don_1960_2023.Rdata")
#don<-as_tibble(don)
don2<-don %>% group_by(date) %>% mutate(ARB_rnk = rank(desc(ARB_est)),
SRF_rnk = rank(desc(SRF_est)),
GDP_rnk = rank(desc(GDP_est)),
GPP_rnk = rank(desc(GPP_est)),
POP_rnk = rank(desc(POP_est)),
URB_rnk = rank(desc(URB_est)),
TOT_rnk = (ARB_rnk+SRF_rnk+GDP_rnk+GPP_rnk+POP_rnk+URB_rnk)/6) 3.1.2 Application au calcul des 20 pays les plus puissants en 1960 et 2019
tab<-don2 %>% filter(date==1960) %>%
select(iso3c, country, TOT_rnk, ARB_rnk,SRF_rnk,GDP_rnk,GPP_rnk,POP_rnk,URB_rnk,TOT_rnk) %>%
arrange(TOT_rnk)
kable(head(tab,20), digits=1)| date | iso3c | country | TOT_rnk | ARB_rnk | SRF_rnk | GDP_rnk | GPP_rnk | POP_rnk | URB_rnk |
|---|---|---|---|---|---|---|---|---|---|
| 1960 | USA | United States | 1.7 | 1 | 3 | 1 | 1 | 3 | 1 |
| 1960 | CHN | China | 3.0 | 4 | 4 | 5 | 2 | 1 | 2 |
| 1960 | IND | India | 4.8 | 2 | 7 | 10 | 5 | 2 | 3 |
| 1960 | RUS | Russian Federation | 4.8 | 3 | 1 | 9 | 8 | 4 | 4 |
| 1960 | BRA | Brazil | 9.2 | 10 | 5 | 13 | 11 | 8 | 8 |
| 1960 | CAN | Canada | 12.0 | 5 | 2 | 8 | 10 | 30 | 17 |
| 1960 | MEX | Mexico | 14.0 | 13 | 14 | 16 | 13 | 16 | 12 |
| 1960 | ARG | Argentina | 14.5 | 14 | 8 | 11 | 12 | 28 | 14 |
| 1960 | FRA | France | 15.3 | 12 | 48 | 4 | 6 | 12 | 10 |
| 1960 | DEU | Germany | 17.0 | 21 | 63 | 2 | 3 | 7 | 6 |
| 1960 | AUS | Australia | 18.7 | 19 | 6 | 12 | 14 | 38 | 23 |
| 1960 | IDN | Indonesia | 19.7 | 15 | 15 | 40 | 26 | 6 | 16 |
| 1960 | JPN | Japan | 20.2 | 36 | 62 | 6 | 7 | 5 | 5 |
| 1960 | ITA | Italy | 21.3 | 20 | 72 | 7 | 9 | 11 | 9 |
| 1960 | TUR | Turkey | 21.3 | 11 | 36 | 22 | 19 | 20 | 20 |
| 1960 | ESP | Spain | 21.7 | 16 | 51 | 17 | 15 | 18 | 13 |
| 1960 | UKR | Ukraine | 21.7 | 8 | 44 | 29 | 23 | 15 | 11 |
| 1960 | GBR | United Kingdom | 22.2 | 31 | 79 | 3 | 4 | 9 | 7 |
| 1960 | PAK | Pakistan | 23.5 | 7 | 35 | 39 | 28 | 13 | 19 |
| 1960 | NGA | Nigeria | 23.7 | 9 | 31 | 34 | 27 | 14 | 27 |
tab<-don2 %>% filter(date==2023) %>%
select(iso3c, country, TOT_rnk, ARB_rnk,SRF_rnk,GDP_rnk,GPP_rnk,POP_rnk,URB_rnk,TOT_rnk) %>%
arrange(TOT_rnk)
kable(head(tab,20), digits=1)| date | iso3c | country | TOT_rnk | ARB_rnk | SRF_rnk | GDP_rnk | GPP_rnk | POP_rnk | URB_rnk |
|---|---|---|---|---|---|---|---|---|---|
| 2023 | USA | United States | 2.2 | 1 | 3 | 1 | 2 | 3 | 3 |
| 2023 | CHN | China | 2.3 | 4 | 4 | 2 | 1 | 2 | 1 |
| 2023 | IND | India | 3.3 | 2 | 7 | 5 | 3 | 1 | 2 |
| 2023 | RUS | Russian Federation | 6.0 | 3 | 1 | 11 | 4 | 9 | 8 |
| 2023 | BRA | Brazil | 6.2 | 5 | 5 | 9 | 7 | 7 | 4 |
| 2023 | IDN | Indonesia | 10.0 | 13 | 14 | 16 | 8 | 4 | 5 |
| 2023 | MEX | Mexico | 12.0 | 15 | 13 | 12 | 13 | 10 | 9 |
| 2023 | CAN | Canada | 16.8 | 7 | 2 | 10 | 16 | 37 | 29 |
| 2023 | TUR | Turkey | 18.7 | 16 | 36 | 18 | 11 | 18 | 13 |
| 2023 | FRA | France | 20.0 | 17 | 49 | 7 | 9 | 22 | 16 |
| 2023 | NGA | Nigeria | 20.0 | 8 | 31 | 42 | 27 | 6 | 6 |
| 2023 | ARG | Argentina | 20.3 | 6 | 8 | 22 | 28 | 34 | 24 |
| 2023 | IRN | Iran, Islamic Rep. | 20.8 | 21 | 17 | 37 | 22 | 17 | 11 |
| 2023 | DEU | Germany | 21.8 | 25 | 64 | 3 | 6 | 19 | 14 |
| 2023 | PAK | Pakistan | 22.0 | 11 | 35 | 46 | 25 | 5 | 10 |
| 2023 | AUS | Australia | 23.7 | 10 | 6 | 13 | 19 | 54 | 40 |
| 2023 | JPN | Japan | 24.3 | 55 | 63 | 4 | 5 | 12 | 7 |
| 2023 | THA | Thailand | 27.7 | 19 | 52 | 27 | 21 | 20 | 27 |
| 2023 | ZAF | South Africa | 27.7 | 24 | 24 | 41 | 33 | 24 | 20 |
| 2023 | ESP | Spain | 27.8 | 26 | 53 | 15 | 15 | 32 | 26 |
3.2 Part du total mondial
Le poids d’un pays dans le monde est entendu ici comme sa part (son pourcentage) du total mondial. il correspond donc à une mesure de puissance relative.
3.2.1 Calcul des poids par variable et date
On utilise à nouveau dplyr pour calculer la part de
chaque pays pour chaque variable à chacune des dates. On ajoute une
variable supplémenaire qui est la moyenne des poids sur les six
classements.
don2<-don2 %>% group_by(date) %>% mutate(ARB_wgt = 100*ARB_est/sum(ARB_est,na.rm=T),
SRF_wgt = 100*SRF_est/sum(SRF_est,na.rm=T),
GDP_wgt = 100*GDP_est/sum(GDP_est,na.rm=T),
GPP_wgt = 100*GPP_est/sum(GPP_est,na.rm=T),
POP_wgt = 100*POP_est/sum(POP_est,na.rm=T),
URB_wgt = 100*URB_est/sum(URB_est,na.rm=T),
TOT_wgt = (ARB_wgt+SRF_wgt+GDP_wgt+GPP_wgt+POP_wgt+URB_wgt)/6)3.2.2 Application au calcul des 20 pays les plus puissants en 1990 et 2020
tab<-don2 %>% filter(date==1960) %>%
select(iso3c, country, TOT_wgt, ARB_wgt,SRF_wgt,GDP_wgt,GPP_wgt,POP_wgt,URB_wgt,TOT_wgt) %>%
arrange(desc(TOT_wgt))
kable(head(tab,20), digits=1)| date | iso3c | country | TOT_wgt | ARB_wgt | SRF_wgt | GDP_wgt | GPP_wgt | POP_wgt | URB_wgt |
|---|---|---|---|---|---|---|---|---|---|
| 1960 | USA | United States | 18.2 | 14.6 | 7.1 | 39.5 | 29.6 | 6.0 | 12.5 |
| 1960 | CHN | China | 10.0 | 8.3 | 7.1 | 4.4 | 7.6 | 22.1 | 10.7 |
| 1960 | IND | India | 7.5 | 12.6 | 2.4 | 2.7 | 4.8 | 14.5 | 7.7 |
| 1960 | RUS | Russian Federation | 6.5 | 9.7 | 12.7 | 2.9 | 3.7 | 4.0 | 6.4 |
| 1960 | DEU | Germany | 3.5 | 1.0 | 0.3 | 6.2 | 5.8 | 2.4 | 5.1 |
| 1960 | CAN | Canada | 2.9 | 3.0 | 7.4 | 3.0 | 2.4 | 0.6 | 1.2 |
| 1960 | JPN | Japan | 2.8 | 0.5 | 0.3 | 3.5 | 4.0 | 3.1 | 5.8 |
| 1960 | BRA | Brazil | 2.8 | 1.9 | 6.3 | 1.2 | 1.7 | 2.4 | 3.3 |
| 1960 | GBR | United Kingdom | 2.8 | 0.6 | 0.2 | 5.3 | 4.8 | 1.7 | 4.1 |
| 1960 | FRA | France | 2.5 | 1.6 | 0.4 | 4.5 | 4.1 | 1.6 | 2.9 |
| 1960 | ITA | Italy | 2.0 | 1.0 | 0.2 | 3.1 | 3.1 | 1.7 | 2.9 |
| 1960 | AUS | Australia | 1.8 | 1.2 | 5.7 | 1.4 | 1.1 | 0.3 | 0.8 |
| 1960 | ARG | Argentina | 1.5 | 1.5 | 2.1 | 1.6 | 1.5 | 0.7 | 1.5 |
| 1960 | MEX | Mexico | 1.4 | 1.6 | 1.5 | 1.0 | 1.2 | 1.2 | 1.8 |
| 1960 | IDN | Indonesia | 1.3 | 1.5 | 1.4 | 0.2 | 0.5 | 2.9 | 1.3 |
| 1960 | UKR | Ukraine | 1.2 | 2.4 | 0.4 | 0.4 | 0.6 | 1.4 | 2.0 |
| 1960 | ESP | Spain | 1.1 | 1.3 | 0.4 | 0.9 | 1.1 | 1.0 | 1.7 |
| 1960 | PAK | Pakistan | 1.1 | 2.5 | 0.6 | 0.3 | 0.5 | 1.5 | 1.0 |
| 1960 | NGA | Nigeria | 0.9 | 1.9 | 0.7 | 0.3 | 0.5 | 1.5 | 0.7 |
| 1960 | KAZ | Kazakhstan | 0.9 | 2.6 | 2.0 | 0.1 | 0.2 | 0.3 | 0.4 |
tab<-don2 %>% filter(date==2023) %>%
select(iso3c, country, TOT_wgt, ARB_wgt,SRF_wgt,GDP_wgt,GPP_wgt,POP_wgt,URB_wgt,TOT_wgt) %>%
arrange(desc(TOT_wgt))
kable(head(tab,20), digits=1)| date | iso3c | country | TOT_wgt | ARB_wgt | SRF_wgt | GDP_wgt | GPP_wgt | POP_wgt | URB_wgt |
|---|---|---|---|---|---|---|---|---|---|
| 2023 | CHN | China | 14.6 | 7.8 | 7.1 | 16.8 | 18.8 | 17.5 | 19.8 |
| 2023 | USA | United States | 11.7 | 11.3 | 7.3 | 26.2 | 15.0 | 4.2 | 6.1 |
| 2023 | IND | India | 9.0 | 11.1 | 2.4 | 3.4 | 7.9 | 17.9 | 11.4 |
| 2023 | RUS | Russian Federation | 5.2 | 8.7 | 12.7 | 1.9 | 3.5 | 1.8 | 2.4 |
| 2023 | BRA | Brazil | 3.6 | 4.2 | 6.3 | 2.1 | 2.4 | 2.6 | 4.0 |
| 2023 | CAN | Canada | 2.5 | 2.7 | 7.4 | 2.0 | 1.3 | 0.5 | 0.7 |
| 2023 | IDN | Indonesia | 2.3 | 1.9 | 1.4 | 1.3 | 2.4 | 3.5 | 3.6 |
| 2023 | JPN | Japan | 2.0 | 0.3 | 0.3 | 4.0 | 3.4 | 1.5 | 2.5 |
| 2023 | AUS | Australia | 1.9 | 2.2 | 5.7 | 1.6 | 1.0 | 0.3 | 0.5 |
| 2023 | DEU | Germany | 1.8 | 0.8 | 0.3 | 4.3 | 3.2 | 1.0 | 1.4 |
| 2023 | MEX | Mexico | 1.7 | 1.4 | 1.5 | 1.7 | 1.8 | 1.6 | 2.3 |
| 2023 | NGA | Nigeria | 1.7 | 2.6 | 0.7 | 0.3 | 0.8 | 2.8 | 2.7 |
| 2023 | PAK | Pakistan | 1.5 | 2.2 | 0.6 | 0.3 | 0.8 | 3.1 | 2.0 |
| 2023 | FRA | France | 1.5 | 1.3 | 0.4 | 2.9 | 2.3 | 0.8 | 1.2 |
| 2023 | GBR | United Kingdom | 1.4 | 0.4 | 0.2 | 3.2 | 2.2 | 0.9 | 1.3 |
| 2023 | ARG | Argentina | 1.3 | 3.0 | 2.1 | 0.6 | 0.7 | 0.6 | 0.9 |
| 2023 | TUR | Turkey | 1.3 | 1.4 | 0.6 | 1.1 | 2.1 | 1.1 | 1.4 |
| 2023 | ITA | Italy | 1.1 | 0.5 | 0.2 | 2.2 | 1.9 | 0.7 | 0.9 |
| 2023 | IRN | Iran, Islamic Rep. | 1.1 | 1.1 | 1.3 | 0.4 | 0.9 | 1.1 | 1.5 |
| 2023 | ESP | Spain | 0.9 | 0.8 | 0.4 | 1.5 | 1.4 | 0.6 | 0.9 |
4 SPATIALISATION
Au cours de cette étape, on va essayer d’associer à chaque pays du
Monde une géométrie permettant d’en faire la cartographie. Longtemps
compliquée, cette opération est maintenant facilitée par le packge
sf (spatial features) qui permet grosso modo de
stocker la géométrie (contour des pays) sous la forme d’une simple
colonne ajoutée au tableau de données. On peut ensuite facilement
réaliser des changements de projections et des cartes statiques ou
dynamiques.
Une difficulté plus importante est de trouver un fonds de carte où le code des unités géométriques corresponde à celui des unités statistiques que nous avons collectées. Cette opération de jointure s’avère toujours délicate et elle l’est tout particulièrement dans le cas des pays du monde qui sont un objet finalement mal défini, tant sur le plan politique que sur le plan statistique.
4.1 L’API Natural Earth
Nous allons ici utiliser le fonds de carte Natural Earth qui est un fonds de carte libre de droit et mis à jour régulièrement. Le site web du projet se situe à l’adresse suivante :
https://www.naturalearthdata.com/
Il indique ses objectifs comme suit :
“Natural Earth is a public domain map dataset available at 1:10m, 1:50m, and 1:110 million scales. Featuring tightly integrated vector and raster data, with Natural Earth you can make a variety of visually pleasing, well-crafted maps with cartography or GIS software.[…] Natural Earth was built through a collaboration of many volunteers and is supported by NACIS (North American Cartographic Information Society), and is free for use in any type of project (see our Terms of Use page for more information).”
On peut télécharger les différents fonds de carte sur le site web,
mais dans une perspective de mise à jour automatique régulière du fonds
de carte il est plus pertinent d’utiliser l’API
rnaturalearthqui permet d’accéder directement à la plupart
des fonds de carte avec juste quelques lignes de code.
4.1.1 le fonds de carte countries110 (171 unités)
On va télécharger tout d’abord le fonds de carte des pays du Monde
avec une forte généralisation des contours countries110 et
le transformer en objet de type sf avant de le visualiser et d’ examiner
le nombre d’unités
[1] 177 169
Ce fonds de carte comporte 171 unités spatiales, mais de quoi s’agit-il exactement. Les métadonnées associées permettent de se faire une idée plus précise de la nature exacte de ces unités. Prenons pour cela quelques exemples
sel<-map[map$adm0_a3 %in% c("FRA", "NCL","ATA","ATF","USA", "PRI","CHN","TWN","MAR", "SAH","CHN","TWN","ISR","PSX"),c("sovereignt","sov_a3","type","admin", "adm0_a3","name","note_adm0","iso_a3","wb_a3")]
kable(sel)| sovereignt | sov_a3 | type | admin | adm0_a3 | name | note_adm0 | iso_a3 | wb_a3 | geometry | |
|---|---|---|---|---|---|---|---|---|---|---|
| 3 | Western Sahara | SAH | Indeterminate | Western Sahara | SAH | W. Sahara | NA | ESH | -99 | MULTIPOLYGON (((-8.66559 27… |
| 5 | United States of America | US1 | Country | United States of America | USA | United States of America | NA | USA | USA | MULTIPOLYGON (((-122.84 49,… |
| 24 | France | FR1 | Dependency | French Southern and Antarctic Lands | ATF | Fr. S. Antarctic Lands | Fr. | ATF | -99 | MULTIPOLYGON (((68.935 -48…. |
| 44 | France | FR1 | Country | France | FRA | France | NA | -99 | FRA | MULTIPOLYGON (((-51.6578 4…. |
| 46 | United States of America | US1 | Dependency | Puerto Rico | PRI | Puerto Rico | U.S.A. | PRI | PRI | MULTIPOLYGON (((-66.28243 1… |
| 77 | Israel | IS1 | Disputed | Israel | ISR | Israel | NA | ISR | ISR | MULTIPOLYGON (((35.71992 32… |
| 80 | Israel | IS1 | Indeterminate | Palestine | PSX | Palestine | NA | PSE | WBG | MULTIPOLYGON (((35.39756 31… |
| 135 | France | FR1 | Dependency | New Caledonia | NCL | New Caledonia | Fr. | NCL | NCL | MULTIPOLYGON (((165.78 -21…. |
| 140 | China | CH1 | Country | China | CHN | China | NA | CHN | CHN | MULTIPOLYGON (((109.4752 18… |
| 141 | Taiwan | TWN | Sovereign country | Taiwan | TWN | Taiwan | NA | TWN | -99 | MULTIPOLYGON (((121.7778 24… |
| 160 | Antarctica | ATA | Indeterminate | Antarctica | ATA | Antarctica | By treaty | ATA | -99 | MULTIPOLYGON (((-48.66062 -… |
| 163 | Morocco | MAR | Sovereign country | Morocco | MAR | Morocco | NA | MAR | MAR | MULTIPOLYGON (((-2.169914 3… |
Les exemples présentés dans le tableau ci-dessus montrent la complexité du problème de définition et de représentation cartographique des “pays” ou “bouts du monde”. Quelques remarques :
- La France (FR1) en tant qu’état souverain regroupe ici cartographiquement la partie métropolitaine du pays et les Départements d’Outre-Mer (Guyane Française, Réunion, Martinique, Guadeloupe) en une seule entité spatiale, mais elle met à part la Nouvelle Calédonie et les îles antarctiques.
- Porto Rico (PRI) est considéré comme une dépendance des Etats-Unis (US1) au même titre que la Nouvelle Calédonie(NCL) est considérée comme une dépendance de la France (FR1).
- Le Sahara occidental (SAH) est considéré comme une zone indéterminée bien qu’il soit occupé par le Maroc (MAR).
- la Palestine (PSX) est considéré comme une zone disputée mais rattachée en terme de souveraineté à Israël (ISR) et une note précise qu’elle est partiellement semi-administrée. Le code sur trois caractères des territoires palestiniens est très variable selon les organisations (PSX, PSE, WBG).
- Taïwan (TWN) est présenté comme un état souverain, mais son code ISO3 est manquant pour la banque mondiale car la Chine refuse de le reconnaître.
- Plusieurs états souverains de petite taille sont absents de ce fonds de carte qui ne regroupe que 175 unités soit moins que les 193 pays membres des Nations-Unies. La plupart des îles du Pacifique sont en particulier éliminées car leur surface les rendrait invisible pour le degré de généralisation cartographique adopté.
4.1.2 le fonds de carte sovereignty110 (171 unités)
On peut obtenir un fonds différent en installant le package
complémentaire rnaturalearthdata qui permet notamment de
distinguer le fonds de carte des countries (c’est-à-dire des
“bouts du monde” souverains ou non) et des sovereignty
(c’est-à-dire des états souverains)
[1] 171 169
Le fonds de carte permet désormais de récupérer la plupart des pays souverains du Monde, y compris les petits états insulaires du Pacifique, mais il fait disparaître de façon sélective les territoires indéterminés ou disputés. Ainsi, le Sahra Occidental demeure partiellement séparé du Maroc mais les territoires palestiniens sont annexés à Israël ainsi que le plateau du Golan ce qui n’est évidemment pas un choix neutred’un point de vue géoolitique.
par(mfrow=c(1,2))
plot(map[map$sov_a3 %in% c("IS1","JOR","SYR","LBN","EGY"),]$geometry, col=c("gray80","orange","gray80","gray80","gray80"))
title("Limits of Israël",cex=0.5)
plot(map[map$sov_a3 %in% c("MAR","SAH","DZA","MRT"),]$geometry, col=c("gray70","orange","gray70","lightyellow"))
title("Limits of Morocco")4.1.3 Le fonds de carte tinycountries110
On peut aussi revenir au fonds de carte des countries et extraire les “petits pays” en ne conservant que leur point central, sans tracer un polygône de contour. On pourra ainsi les cartographier sous forme ponctuelle.
map<-st_as_sf(countries110)
small<-st_as_sf(tiny_countries110)
par(mar=c(0,0,0,0), mfrow=c(1,1))
plot(map$geometry,col="lightyellow")
plot(small$geometry,col="red", add=T)4.1.4 Le fonds de carte countries50
On peut également choisir un fonds moins généralisé dans leque tous les petits pays seront présents
4.1.5 Autres fonds de carte :
Il existe toute une série d’autres fonds de carte dans le package Natural Earth, notamment avec des résolutions plus précises, mais on se limitera ici à l’exploration des fonds de cart utile pour produire des cartes à contour généralisé couvrant le monde entier.
4.2 Application
Nous allons essayer de construire un fonds de carte qui permette de visualiser l’ensemble des données présentes dans le fichier de la banque mondiale en 2015. Plus précisément, nous allons construire deux fonds de carte, l’un avec une résolution faible ne comportant que 175 pays et l’autre avec une résolution détaillée comportant tous les pays.
4.2.1 Fonds de carte wb_map_low
On se limite aux plus grands pays
# Load map
map<-st_as_sf(countries110)
map<-st_transform(map, "+proj=laea +x_0=0 +y_0=0 +lon_0=0 + lat_0=40")
plot(map$geometry)map<-map[c("adm0_a3","name")]
names(map)<-c("iso3c","name","geometry")
# Add polygons center
coo<-st_coordinates(st_centroid(map,of_largest_polygon = T))
map$Lon<-coo[,1]
map$Lat<-coo[,2]
# adjust some codes
map$iso3c[map$iso3c=="KOS"]<-"XKX" # Kosovo
map$iso3c[map$iso3c=="PSX"]<-"PSE" # Palestinian territories
map$iso3c[map$iso3c=="SDS"]<-"SSD" # South Sudan
# Save
st_write(map,"data/wb_map_low.shp",delete_dsn=T)Deleting source `data/wb_map_low.shp' using driver `ESRI Shapefile'
Writing layer `wb_map_low' to data source
`data/wb_map_low.shp' using driver `ESRI Shapefile'
Writing 177 features with 4 fields and geometry type Multi Polygon.
4.2.2 Fonds de carte wb_map_high
# Load map
map<-st_as_sf(countries50)
map<-map[c("adm0_a3","name")]
names(map)<-c("iso3c","name","geometry")
# Add polygons center
coo<-st_coordinates(st_centroid(map,of_largest_polygon = T))
map$Lon<-coo[,1]
map$Lat<-coo[,2]
# adjust some codes
map$iso3c[map$iso3c=="KOS"]<-"XKX" # Kosovo
map$iso3c[map$iso3c=="PSX"]<-"PSE" # Palestinian territories
map$iso3c[map$iso3c=="SDS"]<-"SSD" # South Sudan
# Save
st_write(map,"data/wb_map_high.shp",delete_dsn=T)Deleting source `data/wb_map_high.shp' using driver `ESRI Shapefile'
Writing layer `wb_map_high' to data source
`data/wb_map_high.shp' using driver `ESRI Shapefile'
Writing 242 features with 4 fields and geometry type Multi Polygon.
5 VISUALISATIONS
On va élaborer une série de représentations interactives qui pourront
ultérieurement être reprises dans une application de type dashboard. On
va utiliser pour cela principalement le package plotly.
L’exemple retenu sera celui des émissions de CO2 de 1995 à 2015
5.1 Courbes interactives
5.1.1 GDP en $
don<-readRDS("data/wb_don_1960_2023.Rdata")
tab<-don %>% filter(date > 1960, date < 2023) %>%
select (iso3c, country, date, GDP_est,GDP_rnk, GDP_wgt) %>%
filter(iso3c %in% c("USA","CHN","JPN","RUS","IND","DEU","BRA","FRA","GBR","SAU"))
tab<-as.data.frame(tab)
p <- plot_ly(tab,
x = ~date,
y = ~GDP_wgt,
color= ~country) %>%
add_lines()%>%
layout(title = "PIB en dollars (1960-2023)",
yaxis = list(title = "% de l richesse mondiale", type="log"),
xaxis = list(title = "Année"))
p5.1.2 GDP en ppa
don<-readRDS("data/wb_don_1960_2023.Rdata")
tab<-don %>% filter(date > 1960, date < 2023) %>%
select (iso3c, country, date, GPP_est,GPP_rnk, GPP_wgt) %>%
filter(iso3c %in% c("USA","CHN","JPN","RUS","IND","DEU","BRA","FRA","GBR","SAU"))
tab<-as.data.frame(tab)
p <- plot_ly(tab,
x = ~date,
y = ~GPP_wgt,
color= ~country) %>%
add_lines()%>%
layout(title = "PIB en dollars (1960-2023)",
yaxis = list(title = "% de l richesse mondiale", type="log"),
xaxis = list(title = "Année"))
p5.2 Cartes interactives
5.2.1 GDP
# Load map
map<-readRDS("data/wb_map_high.Rdata")
# Load don for 2015
don<-readRDS("data/wb_don_1960_2023.Rdata")
don<-don[don$date==2023,]
# Merge with map
mapdon<-merge(don,map,by="iso3c",all.x=F,all.y=T)
# Create map
g <- list(showframe = TRUE,
framecolor= toRGB("gray50"),
coastlinecolor = toRGB("black"),
showland = TRUE,
landcolor = toRGB("lightyellow"),
showcountries = TRUE,
countrycolor = toRGB("black"),
countrywidth = 0.2,
projection = list(type = 'azimuthal equal area')
# projection = list(type = 'Mercator')
)
p<- plot_geo(mapdon)%>%
add_markers(x = ~Lon,
y = ~Lat,
sizes = c(0, 1000),
size = ~GDP_wgt,
color= "red",
hoverinfo = "text",
text = ~paste('Pays: ', country,
'<br /> % mondial : ',round(GDP_wgt,3),
'<br /> rang mondial : ',round(GDP_rnk,0))) %>%
layout(geo = g,
title = "Part du PIB mondial (ppa) en 2023",
width=800,
height = 400)
p